#ifndef IJKMEDIAPLAYER_H
#define IJKMEDIAPLAYER_H

#include<mutex>
#include<thread>
#include<functional>
#include<iostream>
#include"ffplay.h"
#include"ffmsg_queue.h"

#define MP_STATE_ASYNC_PREPARING 0
#define MP_STATE_ERROR 10


class IjkMediaPlayer
{
public:
    IjkMediaPlayer();
    ~IjkMediaPlayer();
    // 创建 IjkMediaPlayer，并传入消息处理函数
    int ijkmp_create(std::function<int(void*)> msg_loop);
    // 停止播放
    int ijkmp_stop();
    // 销毁 IjkMediaPlayer播放器
    int ijkmp_destroy();
    // 设置播放数据源——专门提取一个方法是为了适配真正的ijkmediaplaer开发模式，因为真实场景这里可以输入uri，上下文等各个参数，而不仅仅只是输入一个url。后续重载该方法的时候就能发现好处了。
    int ijkmp_set_data_source(const char *url);
    // 准备播放【异步准备】
    int ijkmp_prepare_async();
    // 消息循环处理
    int ijkmp_msg_loop(void *arg);
    // 从消息队列中获取消息，bolck-1：阻塞获取；bolck-0：非阻塞获取
    int ijkmp_get_msg(AVMessage *msg, int block);
    // 开始播放
    void ijkmp_start();
private:
    // 互斥量
    std::mutex mutex_;
    // 真正的播放器
    FFplay *ffplay_ = NULL;
    // 函数指针，指向消息循环函数 int (*msg_loop_l)(void *)
    std::function<int(void*)> msg_loop_l = NULL;
    // 消息机制线程
    std::thread *msg_thread_;
    // 字符串，实际上是播放url
    char *data_source_;
    // 播放器状态，如：prepare、resumed、error、complete等
    int mp_state_;
};

#endif // IJKMEDIAPLAYER_H
